using System;
using System.Collections.Generic;
using System.Linq;

using PMServiceDesk.DataType;
using PMServiceDesk.DataAccess;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.BusinessLogic
{
    public class LineaBaseDetalleLogic
    {
        #region Variables

        private LineaBaseDetalleData _lineaBaseDetalleData;

        #endregion

        #region Constructores

        public LineaBaseDetalleLogic()
        {
            _lineaBaseDetalleData = new LineaBaseDetalleData();
        }

        #endregion

        #region Metodos

        public LineaBaseDetalleType CargarPorId(string id)
        {
            _lineaBaseDetalleData.FiltrarPorId(id);

            return _lineaBaseDetalleData.Cargar();
        }

        public void Grabar(LineaBaseDetalleType lineaBaseDetalle)
        {
            _lineaBaseDetalleData.Grabar(lineaBaseDetalle);
        }

        public void GrabarImportarLineaBase(LineaBaseType lineaBase, LineaBaseImportarType lineaImportar,List<KeyValuePair<string,string>> jefesProyecto)
        {
            PaqueteTrabajoLogic logicTarea = new PaqueteTrabajoLogic();
            RecursoLineaBaseDetalleLogic logicRecursoLineaBase = new RecursoLineaBaseDetalleLogic();
            InteresadoPaqueteTrabajoLogic logicInteresadoTarea = new InteresadoPaqueteTrabajoLogic();

            LineaBaseDetalleType lineaDetalle = new LineaBaseDetalleType();
            lineaDetalle.LineaBaseId = lineaBase.Id;
            lineaDetalle.CodigoCuenta = lineaImportar.CodigoCuenta;
            lineaDetalle.Nombre = lineaImportar.Tarea;
            lineaDetalle.FechaInicioProyectado = ConvertFormat.Char_To_Date(lineaImportar.FechaInicio);
            lineaDetalle.FechaFinProyectado = ConvertFormat.Char_To_Date(lineaImportar.FechaFin);
            lineaDetalle.UsuarioResponsableId = lineaImportar.RecursoResponsableId;

            if (lineaImportar.EsPaqueteTrabajo) lineaDetalle.PaqueteTrabajoId = logicTarea.GrabarPorLineaBaseDetalle(lineaBase, lineaDetalle, lineaImportar).Id;

            this.Grabar(lineaDetalle);

            if (!lineaImportar.EsPaqueteTrabajo) return;

            //Grabo los recursos de la linea Base Detalle
            logicRecursoLineaBase.GrabarLineaBaseDetalle(lineaDetalle.Id, lineaImportar.RecursosImportar);

            //Grabo los interesados del paquete de trabajo
            logicInteresadoTarea.GrabarInteresadosImportarLineaBase(lineaBase.UsuarioRegistroId, lineaDetalle, jefesProyecto, lineaImportar.RecursosImportar);
        }

        public List<LineaBaseDetalleType> CargarGestionLineaBase(LineaBaseType lineaBase,DateTime fechaValor)
        {
            if (lineaBase == null) return new List<LineaBaseDetalleType>();

            List<LineaBaseDetalleType> detalle = _lineaBaseDetalleData.CargarGestionLineaBase(lineaBase.ProyectoId,lineaBase.Id,fechaValor.AddDays(-1));
            ProyectoType proyecto = new ProyectoLogic().CargarPorId(lineaBase.ProyectoId);

            foreach (LineaBaseDetalleType l in detalle)
            {
                if (l.PaqueteTrabajoId != "")
                {
                    this._aplicarFormato(l, proyecto.SimboloMoneda);
                    continue;
                }

                var tareasXCuenta = (
                                        from registro in detalle
                                        where registro.PaqueteTrabajoId != ""
                                        && registro.CodigoCuenta.Substring(0, l.CodigoCuenta.Length) == l.CodigoCuenta
                                        select registro
                                    ).ToList();

                l.FechaInicioProyectado = (
                                            from registro in tareasXCuenta
                                            orderby registro.FechaInicioProyectado ascending
                                            select registro
                                         ).First().FechaInicioProyectado;

                l.FechaFinProyectado = (
                                            from registro in tareasXCuenta
                                            orderby registro.FechaFinProyectado descending
                                            select registro
                                        ).First().FechaFinProyectado;

                l.FechaInicioReal =     (
                                            from registro in tareasXCuenta
                                            orderby registro.FechaInicioReal ascending
                                            select registro
                                         ).First().FechaInicioReal;

                l.FechaFinReal =     (
                                            from registro in tareasXCuenta
                                            orderby registro.FechaFinReal descending
                                            select registro
                                        ).First().FechaFinReal;

                l.BAC = (
                            from registro in tareasXCuenta
                            select registro.BAC
                        ).Sum();

                l.PV = (
                            from registro in tareasXCuenta
                            select registro.PV
                        ).Sum();

                l.PV_SPI = (
                            from registro in tareasXCuenta
                            select registro.PV_SPI
                            ).Sum();

                l.EV = (
                            from registro in tareasXCuenta
                            select registro.EV
                        ).Sum();

                l.AC = (
                            from registro in tareasXCuenta
                            select registro.AC
                        ).Sum();

                l.CPI = SoporteData.CalcularCPI(l.EV, l.AC);
                l.SPI = SoporteData.CalcularSPI(l.EV, l.PV_SPI);

                this._aplicarFormato(l, proyecto.SimboloMoneda);
            }

            return detalle;
        }

        public List<LineaBaseDetalleType> CargarExplorador()
        {
            return _lineaBaseDetalleData.CargarListaVista();
        }

        private void _aplicarFormato(LineaBaseDetalleType l,string simboloMoneda)
        {
            l.FechaInicioProyectado_Format = ConvertFormat.Date_To_Char(l.FechaInicioProyectado);
            l.FechaFinProyectado_Format = ConvertFormat.Date_To_Char(l.FechaFinProyectado);
            l.FechaInicioReal_Format = ConvertFormat.Date_To_Char(l.FechaInicioReal);
            l.FechaFinReal_Format = ConvertFormat.Date_To_Char(l.FechaFinReal);

            l.BAC_Format = simboloMoneda + " " + ConvertFormat.Decimal_To_Char(l.BAC);
            l.PV_Format = simboloMoneda + " " +  ConvertFormat.Decimal_To_Char(l.PV);
            l.EV_Format = simboloMoneda + " " + ConvertFormat.Decimal_To_Char(l.EV);
            l.AC_Format = simboloMoneda + " " + ConvertFormat.Decimal_To_Char(l.AC);

            l.CPI_Format = ConvertFormat.Decimal_To_Char(l.CPI);
            l.SPI_Format = ConvertFormat.Decimal_To_Char(l.SPI);
        }

        #endregion
    }
}
